<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

</body>
<script>
	// > * let关键词声明的变量不存在变量提升
	{
		// 基本数据类型：字符串 数字 布尔 null undefined(当变量只是声明了当未赋值，对象属性不存在，函数当中接收的参数未传递)
		// es5
		// console.log(a);// undefined
        // var a = 1;
		// console.log(a);// 1

		// var a;
		// console.log(a);// undefined
		// a = 1;
		// console.log(a);// 1
    }
	// > >  和var不同的还有，let命令不存在变量提升，所以声明前调用变量，都会报错，
    //      这就涉及到一个概念——暂时性死区。
	{
		// console.log(username);
		// let username = "zhaoliu";
		// console.log(username);
    }
	// > >  暂时性死区即：区块中存在`let`或`const`命令，这个区块对这些命令声明的变量，从一开始就形
	// > >  成了封闭作用域。凡是在声明之前就使用这些变量，就会报错。

	// > * 不允许重复声明
	// {
	// 	// es5:允许重复声明
    //     // var a = 1;
	// 	// var a = 2;
	// 	// console.log(a);
    //
    //     // es6:不允许重复声明
	// 	let a = 1;
	// 	let a = 2;
	// 	console.log(a);
    // }
	// > > let 只能声明一次而var 可以声明多次。
	// > * 块级作用域的出现，实际上使得获得广泛应用的匿名立即执行函数表达式不再必要了

	// // (function(a,b,c,d){
	// // 	var age = 100;
	// // 	// console.log(a,b,c,d);
    // // })(1,2,3,4);
	// // console.log(age);
    //
	// {
	// 	let age = 100;
    // }


	// > * let 是在代码块内有效，var 是在全局范围内有效
	// > * 不影响作用域链
	// > > let与var都拥有作用域链。
	// > > 作用域链： 如果在当前作用域中没有查到值，就会向上级作用域去查，直到查到全局作用域，
    // 这么一个查找过程形成的链条就叫做作用域链。
	// {
	// 	var username = "lisi";
	// 	{
	// 		var username = "wangwu";
	// 		console.log(username);// lisi
    //     }
    // }
	// > * 不再是顶层全局对象的属性
	// > >  使用var定义的全局变量相当于直接挂载在window对象上， 而let不会。
    // window
	{
		// es5当中声明的变量默认全部都会作为window对象下的属性
        var a = 1;
		let b = 2;
		console.log(a,window.a,b,window.b);
    }
</script>
</html>